#include "net.h"

void do_register(int sockfd, MSG *msg);
int do_login(int sockfd, MSG *msg);
int do_query(int sockfd, MSG *msg);
int do_history(int sockfd, MSG *msg);
//msg
MSG msg;
//	./client 192.168.1.123 10000
int main(int argc, char *argv[])
{
	if (argc != 3)
	{
		printf("Usage:%s serverip port\n", argv[0]);
		return -1;
	}
	//1.socket
	int sockfd;
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
	{
		perror("socket");
		return -1;
	}
	//2.connect
	struct sockaddr_in serveraddr;
	bzero(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	serveraddr.sin_port = htons(atoi(argv[2]));
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]);
	
	if (connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
	{
		perror("connect");
		return -1;
	}
	//menu1
	int n;
	while (1)
	{
		printf("***************************\n");
		printf("*1.register	2.login 3.quit*\n");
		printf("***************************\n");
		printf("Please choose:");
		scanf("%d", &n);
		getchar();
		
		switch (n)
		{
			case 1:
				do_register(sockfd, &msg);
				break;
			case 2:
				if (do_login(sockfd, &msg) == 1)
				{
					goto next;
				}
				break;
			case 3:
				close(sockfd);
				exit(0);
				break;
			default:
				printf("Invalid data command!\n");
				break;
		}
	}
	//menu2
next:
	while (1)
	{
		printf("**************************************\n");
		printf("*1.query word 2.history record 3.quit*\n");
		printf("**************************************\n");
		printf("Please choose:");
		scanf("%d", &n);
		getchar();
		
		switch (n)
		{
			case 1:
				do_query(sockfd, &msg);
				break;
			case 2:
				do_history(sockfd, &msg);
				break;
			case 3:
				close(sockfd);
				exit(0);
				break;
			default:
				printf("Invalid data command!\n");
				break;
		}
	}
	return 0;
}

void do_register(int sockfd, MSG *msg)
{
	msg->type = R;
	msg->flag = NORMAL;
	printf("Please input your name:");
	scanf("%s", msg->name);
	if (msg->name == "root")
	{
		printf("Can not register name like this!\n");
		return;
	}
	printf("Please input your password:");
	scanf("%s", msg->data);

	if (send(sockfd, msg, sizeof(MSG), 0) < 0)
	{
		printf("failed to send!\n");
		return;
	}

	if (recv(sockfd, msg, sizeof(MSG), 0) < 0)
	{
		printf("failed to recv!\n");
		return;
	}
	//OK or user already existed
	printf("%s\n", msg->data);
}

int do_login(int sockfd, MSG *msg)
{
	msg->type = L;
	printf("Please input your name:");
	scanf("%s", msg->name);
	printf("Please input your password:");
	scanf("%s", msg->data);
	if ((strcmp(msg->name, "root") == 0) && (strcmp(msg->data, "1") == 0))
	{
		msg->flag = SUPER;
		printf("Welcome!My lord!\n");
		return 1;
	}
	else
	{
		if (send(sockfd, msg, sizeof(MSG), 0) < 0)
		{
			perror("recv");
			return -1;
		}
		if (recv(sockfd, msg, sizeof(MSG), 0) < 0)
		{
			perror("send");
			return -1;
		}
		if (strcmp(msg->data, "OK") == 0)
		{
			printf("login successfully!\n");
		}
		else
		{
			printf("%s\n", msg->data);
			return -1;
		}
	}
	return 1;
}

int do_query(int sockfd, MSG *msg)
{
	msg->type = Q;
	puts("-----------------------------\n");
	while (1)
	{
		printf("Please input a word you want to query:");
		scanf("%s", msg->data);
		if (strcmp(msg->data, "#") == 0)
			break;
		if (send(sockfd, msg, sizeof(MSG), 0) < 0)
		{
			perror("send");
			return -1;
		}
		if (recv(sockfd, msg, sizeof(MSG), 0) < 0)
		{
			perror("recv");
			return -1;
		}
		printf("result:%s\n", msg->data);
	}
	return 1;
}

int do_history(int sockfd, MSG *msg)
{
	/*
	if (msg->flag == SUPER)
	{
		printf("all history...\n");
	}
	else
	{
		printf("history...\n");
	}
	*/
	msg->type = H;
	if (send(sockfd, msg, sizeof(MSG), 0) < 0)
	{
		perror("send");
		return -1;
	}
	
	while (1)
	{
		if (recv(sockfd, msg, sizeof(MSG), 0) < 0)
		{
			perror("recv");
			return -1;
		}
		if (msg->data[0] == '\0')
			break;
		printf("%s\n", msg->data);
	}
	return 0;
}
